
import transaction
import cryptacular.bcrypt
from pyramid.security import Allow
from pyramid.security import Everyone
from pyramid.security import Authenticated
from sqlalchemy import Table
from sqlalchemy import Column
from sqlalchemy import ForeignKey
from sqlalchemy import or_
from sqlalchemy.orm import scoped_session
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import relation
from sqlalchemy.orm import backref
from sqlalchemy.orm import column_property
from sqlalchemy.orm import synonym
from sqlalchemy.orm import joinedload
from sqlalchemy.types import Integer
from sqlalchemy.types import Unicode
from sqlalchemy.types import UnicodeText
from sqlalchemy.sql import func
from sqlalchemy.exc import IntegrityError
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import scoped_session
from sqlalchemy.orm import sessionmaker
from zope.sqlalchemy import ZopeTransactionExtension
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
Base = declarative_base()

from .models import Usuario
from .models import Historial
from .models import Rol
from .models import AsociacionUsuarioRol
from .models import RelacionSucesor
from .models import Proyecto
from .models import Fase
from .models import TipoItem
from .models import Item
from .models import Permiso
from .models import AsociacionRolProyecto
from .models import AsociacionRolFase
from .models import AsociacionRolTipoItem
from .models import AsociacionRolPermiso
from .models import AsociacionFaseTipoItem


"""
Seccion que inicializa la base de datos
"""

def populate():
	transaction.begin()
	session= DBSession()
	usuario1= Usuario('administrador', 'admin2012', 'Administrador','Administrador',0, 0 , 'admin@gmail.com')
	f= open('alpha/static/avatar/admin.jpg','rb')
	usuario1.setImagen(f.read())
	usuario1.setNombreImagen('admin.jpg')
	usuario1.setTipoImagen('jpg')
	f.close()
	usuario2= Usuario('liderProyecto', 'proyecto2012', 'Lider de Proyecto','Lider de Proyecto',0, 0 , 'proyecto@gmail.com')
	f= open('alpha/static/avatar/liderProyecto.jpg','rb')
	usuario2.setImagen(f.read())
	usuario2.setNombreImagen('liderProyecto.jpg')
	usuario2.setTipoImagen('jpg')
	f.close()
	usuario3= Usuario('liderFase', 'fase2012', 'Lider de Fase', 'Lider de Fase',0, 0 , 'fase@gmail.com')
	f= open('alpha/static/avatar/liderFase.png','rb')
	usuario3.setImagen(f.read())
	usuario3.setNombreImagen('liderFase.png')
	usuario3.setTipoImagen('png')
	f.close()
	usuario4= Usuario('desarrollador', 'desarrollo2012', 'Desarrollador','Desarrollador',0, 0 , 'desarrollo@gmail.com')
	f= open('alpha/static/avatar/desarrollador.png','rb')
	usuario4.setImagen(f.read())
	usuario4.setNombreImagen('desarrollador.png')
	usuario4.setTipoImagen('png')
	f.close()
	session.add(Permiso('adm-crear-usuario', 'Administrador'))
	session.add(Permiso('adm-modificar-usuario', 'Administrador'))
	session.add(Permiso('adm-eliminar-usuario', 'Administrador'))
	session.add(Permiso('adm-listar-usuarios', 'Administrador'))
	session.add(Permiso('adm-crear-rol', 'Administrador'))
	session.add(Permiso('adm-modificar-rol', 'Administrador'))
	session.add(Permiso('adm-eliminar-rol', 'Administrador'))
	session.add(Permiso('adm-listar-roles', 'Administrador'))
	session.add(Permiso('adm-asignar-rol', 'Administrador'))
	session.add(Permiso('adm-asignar-permiso', 'Administrador'))
	session.add(Permiso('adm-asignar-desasignar-tipo-item-rol', 'Administrador'))
	session.add(Permiso('adm-asignar-desasignar-proyecto-rol', 'Administrador'))
	session.add(Permiso('adm-asignar-desasignar-fase-rol', 'Administrador'))
	session.add(Permiso('adm-crear-proyecto', 'Administrador'))
	session.add(Permiso('adm-modificar-proyecto', 'Administrador'))
	session.add(Permiso('adm-eliminar-proyecto', 'Administrador'))
	session.add(Permiso('adm-listar-proyectos','Administrador'))
	session.add(Permiso('adm-asignar-lider-proyecto', 'Administrador'))
	session.add(Permiso('conf-iniciar','LiderProyecto'))
	session.add(Permiso('conf-terminar','LiderProyecto'))
	session.add(Permiso('conf-crear-fase','LiderProyecto'))
	session.add(Permiso('conf-modificar-fase','LiderProyecto'))
	session.add(Permiso('conf-eliminar-fase','LiderProyecto'))
	session.add(Permiso('conf-listar-fases','LiderProyecto'))
	session.add(Permiso('conf-crear-tipo-item','LiderProyecto'))
	session.add(Permiso('conf-importar-fases','LiderProyecto'))
	session.add(Permiso('conf-asignar-tipo-item-fase','LiderProyecto'))
	session.add(Permiso('conf-modificar-tipo-item','LiderProyecto'))
	session.add(Permiso('conf-eliminar-tipo-item','LiderProyecto'))
	session.add(Permiso('conf-listar-tipos-item','LiderProyecto')) 
	session.add(Permiso('des-crear-item','Desarrollador'))
	session.add(Permiso('des-modificar-item','Desarrollador'))
	session.add(Permiso('des-eliminar-item','Desarrollador'))
	session.add(Permiso('des-listar-items','Desarrollador'))
	session.add(Permiso('ges-aprobar-desaprobar','LiderFase'))
	session.add(Permiso('des-eliminar-revivir-item','Desarrollador'))
	session.add(Permiso('des-calcular-impacto','Desarrollador'))
	session.add(Permiso('ges-generar-lb','LiderFase'))
	session.add(Permiso('ges-listar-lbs','LiderFase'))
	rol1= Rol('Administrador','Administrador del sistema')
	rol1.setTipo('Administrador')
	rol2= Rol('LiderProyecto','Lider de proyecto')
	rol2.setTipo('LiderProyecto')
	rol3= Rol('LiderFase','Lider de fase')
	rol3.setTipo('LiderFase')
	rol4= Rol('Desarrollador','Desarrollador')
	rol4.setTipo('Desarrollador')
	rol1.inicializarPermisos(session)
	rol2.inicializarPermisos(session)
	rol3.inicializarPermisos(session)
	rol4.inicializarPermisos(session)
	asociacion1= AsociacionUsuarioRol()#para el usuario1, el administrador
	asociacion2= AsociacionUsuarioRol() 
	asociacion3= AsociacionUsuarioRol()
	asociacion4= AsociacionUsuarioRol()    
	asociacion1.rol= rol1
	asociacion2.rol= rol2
	asociacion3.rol= rol3
	asociacion4.rol= rol4
	usuario1.asociacionRol.append(asociacion1)
	usuario2.asociacionRol.append(asociacion2)
	usuario3.asociacionRol.append(asociacion3)
	usuario4.asociacionRol.append(asociacion4)
	session.add(usuario1)
	session.add(usuario2)
	session.add(usuario3)
	session.add(usuario4)
	transaction.commit()


def initialize_sql(engine):
	DBSession.configure(bind=engine)
	Base.metadata.bind = engine
	Base.metadata.create_all(engine)
	try:
		populate()
	except IntegrityError:
		# already created
		transaction.abort()


